package cn.iocoder.yudao.framework.datapermission.v2;

import java.io.Serializable;
import java.util.List;

/**
 * 数据权限范围提供者接口，参阅 <a href="https://gitee.com/dibo_software/diboot/blob/develop-v3/diboot-core/src/main/java/com/diboot/core/data/access/DataScopeManager.java">diboot#DataScopeManager</a> 类
 *
 * @author mazc@dibo.ltd
 * @author 山野羡民（1032694760@qq.com）
 * @since 2025/04/06
 */
@SuppressWarnings("unused")
public interface DataPermissionScopeProvider {

    /**
     * 显示标题
     */
    default String getTitle() {
        return getClass().getSimpleName();
    }

    /**
     * <table border="10">
     * <caption>可访问的数据范围编号添加条件规则</caption>
     * <tr>
     * <th>返回值</th>
     * <th>SQL 片段</th>
     * <th>说明</th>
     * </tr>
     * <tr>
     * <td>null</td>
     * <td>-</td>
     * <td>为`null`不加入条件</td>
     * </tr>
     * <td>[]</td>
     * <td>IS NULL</td>
     * <td></td>
     * </tr>
     * <tr>
     * <td>[10001]</td>
     * <td>= '10001'</td>
     * <td>长度等于`1`的列表</td>
     * </tr>
     * <tr>
     * <td>[10001, 10002] &nbsp</td>
     * <td>IN ('10001', '10002') &nbsp</td>
     * <td>长度大于`1`的列表</td>
     * </tr>
     * </table>
     */
    List<? extends Serializable> getScopeIds(String fieldName);

    /**
     * 基于数据实体类和字段名获取可访问的数据范围编号
     *
     * @param entityClass 实体类
     * @param fieldName 字段名
     * @return 可访问的范围编号
     */
    default List<? extends Serializable> getScopeIds(Class<?> entityClass, String fieldName) {
        return getScopeIds(fieldName);
    }

    /**
     * 该数据权限涉及的实体类，基于代码的数据权限必须指定
     */
    List<Class<?>> getEntityClasses();

}
